#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QSoundEffect>
#include <QMediaPlayer>
#include <QAudioOutput>

QT_BEGIN_NAMESPACE

namespace Ui { class MainWindow; }
QT_END_NAMESPACE

struct MediaPlayerSound {
    QMediaPlayer* player;
    QAudioOutput* output;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public:
    QString getLogBuffer();


private:
    Ui::MainWindow *ui;
    QString appPath;         // 临时提取的应用程序路径
    QString filePath;        // 临时提取的文件路径
    QString basePath;        // 当前根目录
    QStringList romFilePaths;    // rom路径

    QVector<QString> imagePaths; // 保存图片路径
    int currentIndex = 0;        // 当前显示的图片索引
    QPixmap cachedPixmap;  // 缓存当前图片，避免频繁加载
    int totalPages = 15;            // 总页数（固定15）
    std::vector<QLabel*> labels;  // <<< 作为成员变量声明
    QVector<MediaPlayerSound> soundEffects;        // 用于播放完整音效
    QVector<QSoundEffect*> soundEffectPool;        // 用于池化快速播放音效（适合短 UI 音）
    int currentPoolIndex = 0;

    void initHoverSounds();      // 初始化音效池
    void playHoverSound();       // 播放悬浮音效
    QMenu* pageSubMenu = nullptr;
    void toggleactionRememberlastPage(bool checked);
    bool rememberlastPage = false; // 记住上次页面
    void toggleRememberLastPage(bool checked); // 记住上次页面
    QStringList recentLabels; // 存储最近打开的标签

    QMenu *recentLabelsSubMenu = nullptr;      // 实际的菜单对象
    QMenu* recentLabelsMenu = nullptr;

protected:
    void paintEvent(QPaintEvent *event) override;

private slots:


    void on_prevButton_clicked();

    void on_nextButton_clicked();

    void on_lastButton_clicked();

    void on_firstButton_clicked();

    void on_actionOpen_triggered();

    void on_actionList_triggered();

    void on_actionRandom_triggered();

    void on_actionAbout_triggered();

    void on_actionLog_triggered();

    void on_actionRandompage_triggered();

    void on_actionControl_triggered();



    void on_CreateDesktopShortcut_triggered();

    void onLabelRightClicked(const QPoint &pos);

    void on_actionSearchFile_triggered();

    void on_actionPathset_triggered();

private:
    void openAppWithFile(const QString &app, const QString &file);
    bool extractResource(const QString &resourcePath, const QString &destinationPath);
    void initImagePaths();      // 初始化背景图路径
    void initAppPaths();        // 初始化模拟器和ROM路径
    void initLabel(const std::vector<QLabel*> &labels);           // 设置 QLabel 的链接文本

    void printDebugInfo();      // 调试信息输出

    void showCurrentImage();    // 显示当前图片页码（标签更新）
    void loadRomFilePaths();
    void launchEmulator(const QString &romPath);    // 启动模拟器并加载rom
    void launchEmulator();      // 启动模拟器
    void playSound(int index);
    void startGame();
    void setPage(int index);
    bool eventFilter(QObject *obj, QEvent *event) override;
    void handlePageEdit();
    void fontInit();
    void initSoundEffects(const QStringList &mediaPaths, const QString &poolSoundPath, int poolSize, float volume);
    void playSoundByIndex(int index);
    void playPooledSound();
    void buildPageMenu(QMenu *fileMenu, int totalPages);
    void saveSettings();
    void loadSettings();

    void buildRecentLabelsMenu(QMenu *parentMenu);
    void onRecentLabelSelected(const QString &label);
    void processLabel(const QString &label);
    void handleLabelClick(const QString &romPath, const QString &labelText, QMenu *menu);
    void updateRecentLabels(const QString &labelText, QMenu *menu);


    QString getRomNameFromPath(const QString &romPath);
};

#endif // MAINWINDOW_H
